<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2010 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: luofei614 <www.3g4k.com>
// +----------------------------------------------------------------------
// $Id: SaeTaskQueue.class.php 2766 2012-02-20 15:58:21Z luofei614@gmail.com $
/**
 *任务列队
 *本地环境暂时需要支持curl才行。
 */
class SaeTaskQueue extends SaeObject {
	public $queue = array ();
	//添加列队
	public function addTask($tasks, $postdata = null, $prior = false, $options = array()) {
		if (is_string ( $tasks )) {
			if (! filter_var ( $tasks, FILTER_VALIDATE_URL )) {
				$this->errno = SAE_ErrParameter;
				$this->errmsg = Imit_L ( "_SAE_ERRPARAMTER_" );
				return false;
			}
			
			//添加单条任务
			$item = array ();
			$item ['url'] = $tasks;
			if ($postdata != NULL)
				$item ['postdata'] = $postdata;
			if ($prior)
				$item ['prior'] = true;
			$tasks = $item;
		}
		if (empty ( $tasks )) {
			$this->errno = SAE_ErrParameter;
			$this->errmsg = Imit_L ( "_SAE_ERRPARAMTER_" );
			return false;
		}
		
		//记录任务，处理优先
		foreach ( $tasks as $k => $v ) {
			if (is_array ( $v ) && isset ( $v ['url'] )) {
				//当是二维数组时
				if ($v ['prior']) {
					$this->queue = array_merge ( array ($v ), $this->queue );
				} else {
					$this->queue [] = $v;
				}
			} elseif (isset ( $tasks ['url'] )) {
				//当是一维数组时
				if ($tasks ['prior']) {
					$this->queue = array_merge ( array ($tasks ), $this->queue );
				} else {
					$this->queue [] = $tasks;
				}
				break;
			} else {
				$this->errno = SAE_ErrParameter;
				$this->errmsg = Imit_L ( "_SAE_ERRPARAMTER_" );
				return false;
			}
		}
		
		return true;
	}
	
	public function curLength() {
		return true;
	}
	
	public function leftLength() {
		return true;
	}
	
	public function push() {
		//todu, 当用户环境不支持curl时用socket发送。
		if (empty ( $this->queue ))
			return false;
		$s = curl_init ();
		foreach ( $this->queue as $k => $v ) {
			curl_setopt ( $s, CURLOPT_URL, $v ['url'] );
			//curl_setopt($s,CURLOPT_TIMEOUT,5);
			curl_setopt ( $s, CURLOPT_RETURNTRANSFER, true );
			curl_setopt ( $s, CURLOPT_HEADER, 1 );
			curl_setopt ( $s, CURLINFO_HEADER_OUT, true );
			curl_setopt ( $s, CURLOPT_POST, true );
			curl_setopt ( $s, CURLOPT_POSTFIELDS, $v ['postdata'] );
			$ret = curl_exec ( $s );
			$info = curl_getinfo ( $s );
			// print_r($info);
			if (empty ( $info ['http_code'] )) {
				$this->errno = SAE_ErrInternal;
				$this->errmsg = Imit_L ( "_SAE_TASKQUEUE_SERVICE_FAULT_" );
				return false;
			} else if ($info ['http_code'] != 200) {
				$this->errno = SAE_ErrInternal;
				$this->errmsg = Imit_L ( "_SAE_TASKQUEUE_SERVICE_ERROR_" );
				return false;
			} else {
				//todu 这里好像有些问题
				if ($info ['size_download'] == 0) { // get MailError header
					$this->errno = SAE_ErrUnknown;
					$this->errmsg = Imit_L ( "_SAE_UNKNOWN_ERROR_" );
					return false;
				}
			}
		}
		//循环结束
		$this->queue = array (); //清空列队
		

		return true;
	}
}

?>